#include"thttpd.h"
#include"custom_handle.h"
#include <sys/types.h>
#include <sys/wait.h>
#include <sqlite3.h>
sqlite3 *db;
char *errmsg = NULL;
static void* msg_request(void *arg)
{
	//这里客户端描述符通过参数传进来了
	intptr_t acceptfd=(intptr_t)arg;

	// 一般情况下，线程终止后，其终止状态一直保留到其它线程调用pthread_join获取它的状态为止。
	//但是线程也可以被置为detach状态，这样的线程一旦终止就立刻回收它占用的所有资源，而不保留终止状态。
	pthread_detach(pthread_self());	

	//handler_msg作为所有的请求处理入口
	return (void*)(intptr_t)handler_msg((int)acceptfd);
}

int main(int argc,char* argv[])
{
	//如果不传递端口，那么使用默认端口80
	int port = 80;

	if(argc > 1)
	{
		port = atoi(argv[1]);
	}

	//初始化服务器
	int lis_sock=init_server(port);
	
	// 打开数据库
    if (sqlite3_open("../database.db", &db) != SQLITE_OK)
    {
        fprintf(stderr, "open err:%s", sqlite3_errmsg(db));
        return -1;
    }
    printf("open db ok\n");

	// 创建表
    if (sqlite3_exec(db, "create table user(username char primary key,password char);", NULL, NULL, &errmsg))
    {
        fprintf(stderr, "creat user err:%s\n", errmsg);
        // return -1;
    }

	while(1)
	{
		struct sockaddr_in peer;
		socklen_t len=sizeof(peer);
		
		int acceptfd=accept(lis_sock,(struct sockaddr*)&peer,&len);
		
		if(acceptfd<0)
		{
			perror("accept failed");
			continue;
		}
		
		//每次接收一个链接后，会自动创建一个线程，这实际上就是线程服务器模型的应用
		pthread_t tid;
		if(pthread_create(&tid,NULL,msg_request,(void*)(intptr_t)acceptfd)>0)
		{
			perror("pthread_create failed");
			close(acceptfd);
		}
	}
	return 0;
}
